<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>再回顾原型继承</title>
</head>
<body>
<script>
    /*
    * 迷思:子类将prototype设置为父类对象 那么子类再在自己的prototype上定义方法的会影响父类吗？
    * 回答:会的 子类在自己的原型上定义方法的同时父类对象上也会出现这个方法 但是这并不影响父类 因为是基于对象继承 只会影响拿一个实例对象而已
    *
    * 从上面我们也可以发现子类查找方法的顺序
    *   现在自身上找 找不到再去原型,也就是我们这里的父类对象身上找 注意这里因为子类往原型上定义方法其实是往父类实例对象身上定义
    *   所以子类在这一层寻找方法的时候如果我们在子类原型上定义了和父类实例对象相同名字的方法的话是会产生覆盖的，所以更加严谨的说在这一轮的寻找中
    * 子类其实是在找自己在原型上定义的方法和父类实例对象身上定义的方法，如果还没有再找父类的原型
    * 以上这个特点在class中更加直观 子类现在自己的构造函数中找方法 再在自己的class中找，再到父类的构造函数中找，最后在父类的class中找
    *
    * 要注意原型继承的顺序
    * 子类要先继承(设置prototype)再在自己的原型上定义方法 对比使用extends的方式进行继承也是先产生继承关系后再在自己的原型上定义方法的
    *
    * */

    /*
    * JS中的原型继承本质上是基于对象的继承
    * */

    function User() {
        this.name = 'P'

    }

    User.prototype.getName = function () {
        console.log(this.name)
    }


    function Student() {

    }


    /*
       想让Student继承User一般我们会直接这样写
    *  Student.prototype = new User()
    * */

    let pt = new User()

    Student.prototype = pt

    Student.prototype.getAge = function () {
        console.log('age')
    }

    //
    // let student = new Student()
    // let user = new User()
    // student.getAge()
    // student.getName()


    // console.log(user)
    // console.log(student)


    console.log(pt)

    function User2() {

    }

    User2.prototype.print1 = function () {
        console.log("print1")
    }

    function Student2() {

    }

    /*
    * 如果子类先在自己的原型上定义方法再使用原型继承父类的话就会发生自己定义的方法丢失的问题
    * 因为   Student2.prototype = new User2()
    * 子类的原型改变了
    *
    * */

    Student2.prototype.print2 = function () {
        console.log("print2")
    }

    Student2.prototype = new User2()


    let stu2 = new Student2()
    stu2.print1()
    stu2.print2()


</script>
</body>
</html>